package com.kfzx.www.project;

import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.Location;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.amap.api.fence.GeoFence;
import com.amap.api.fence.GeoFenceClient;
import com.amap.api.fence.GeoFenceListener;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.DPoint;
import com.amap.api.maps.AMap;
import com.amap.api.maps.AMapOptions;
import com.amap.api.maps.AMapUtils;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.Circle;
import com.amap.api.maps.model.CircleOptions;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.MyLocationStyle;
import com.amap.api.maps.model.Polyline;
import com.amap.api.maps.model.PolylineOptions;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements
        AMap.OnMyLocationChangeListener //设定监听我的位置经纬度等信息
        , View.OnClickListener
        , AMap.OnMarkerClickListener//Marker 点击事件
//        , AMap.OnMarkerDragListener//Marker 拖拽事件
        , GeoFenceListener //地理围栏的回掉
        , LocationSource
        , AMapLocationListener


{
    private static final String TAG = "MainActivity";
    private MapView mapView;
    private AMap aMap;
    //定义一个UiSettings对象
//    控件是指浮在地图图面上的一系列用于操作地图的组件，例如缩放按钮、指南针、定位按钮、比例尺等。比例尺等
//    UiSettings 类用于操控这些控件，以定制自己想要的视图效果。UiSettings 类对象的实例化需要通过 AMap 类来实现：
    private UiSettings mUiSettings;
    private TextView mTextView;
    private Button mStandardButton, mTrafficButton, mNightButton, mNavigationButton, mSatelliteButton;
    private MyLocationStyle mMyLocationStyle;

    private EditText mCustomIdEditText, mRadiusEditText;
    private Button mAddFenceButton;

    private GeoFenceClient mGeoFenceClient;
    // 地理围栏的广播action
    private static final String GEOFENCE_BROADCAST_ACTION = "com.example.geofence.round";
    private OnLocationChangedListener mListener;
    private AMapLocationClientOption mOption;
    private AMapLocationClient mLocationClient;
    private List<GeoFence> mGeoFenceList = new ArrayList<>();
    private Marker mDestinationMarker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initPermissions();

        mGeoFenceClient = new GeoFenceClient(getApplicationContext());

        // TODO: 2018/7/17 重点
        mapView = (MapView) findViewById(R.id.map_view);
        mapView.onCreate(savedInstanceState);// 此方法必须重写


        if (aMap == null) {
            aMap = mapView.getMap();
//            /实例化UiSettings类对象
            mUiSettings = aMap.getUiSettings();
            initUiSettings();

//            设定监听我的位置经纬度等信息
            aMap.setOnMyLocationChangeListener(this);
            showMyLocation();
            //设置你是否显示室内定位
//            showIndoorMap(true);
            //设置你地图的语言
//            setMapLanguage();
            //手势交互，默认全部开启
//            gestureInteraction();

//            //在地图上显示不同的点
//            LatLng latLng = new LatLng(39.906901, 116.397972);
//            showMarker(latLng);


//            // 在地图上画线
//            addPolyline();
//            drawCrilcle();


            //Marker 点击事件
            aMap.setOnMarkerClickListener(this);
//            Marker拖拽的监听
//            aMap.setOnMarkerDragListener(this);
        }


        initViews();
    }

    private void initViews() {
        mTextView = (TextView) findViewById(R.id.my_location_text_view);
        mStandardButton = (Button) findViewById(R.id.normal_map_button);
        mStandardButton.setOnClickListener(this);
        mTrafficButton = (Button) findViewById(R.id.traffic_map_button);
        mTrafficButton.setOnClickListener(this);
        mNightButton = (Button) findViewById(R.id.night_map_button);
        mNightButton.setOnClickListener(this);
        mNavigationButton = (Button) findViewById(R.id.navigation_map_button);
        mNavigationButton.setOnClickListener(this);
        mSatelliteButton = (Button) findViewById(R.id.satellite_map_button);
        mSatelliteButton.setOnClickListener(this);


        mCustomIdEditText = (EditText) findViewById(R.id.custom_id);
        mRadiusEditText = (EditText) findViewById(R.id.radius);

        mAddFenceButton = (Button) findViewById(R.id.add_fence);
        mAddFenceButton.setOnClickListener(this);

        registerReceiver();

    }


    private void registerReceiver() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(GEOFENCE_BROADCAST_ACTION);
        registerReceiver(mBroadcastReceiver, intentFilter);


        mGeoFenceClient.createPendingIntent(GEOFENCE_BROADCAST_ACTION);
        mGeoFenceClient.setGeoFenceListener(this);
        mGeoFenceClient.setActivateAction(GeoFenceClient.GEOFENCE_IN);

    }

    // TODO: 2018/7/18
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(GEOFENCE_BROADCAST_ACTION)) {
                Bundle bundle = intent.getExtras();
                String customId = bundle.getString(GeoFence.BUNDLE_KEY_CUSTOMID);
                String fenceId = bundle.getString(GeoFence.BUNDLE_KEY_FENCEID);
                StringBuffer stringBuffer = new StringBuffer();
                int status = bundle.getInt(GeoFence.BUNDLE_KEY_FENCESTATUS);
                switch (status) {
                    case GeoFence.STATUS_LOCFAIL:
                        //定位失败
                        break;
                    case GeoFence.STATUS_IN:
                        Log.d(TAG, "onReceive: 进入围栏");
                        Toast.makeText(getApplicationContext(), "进入围栏", Toast.LENGTH_LONG).show();
                        //进入围栏
                        break;
                    case GeoFence.STATUS_OUT:
                        Log.d(TAG, "onReceive:离开围栏 ");
                        Toast.makeText(getApplicationContext(), "离开围栏", Toast.LENGTH_LONG).show();

                        //离开围栏
                        break;
                    case GeoFence.STATUS_STAYED:
                        Log.d(TAG, "onReceive: 停留在围栏内");
                        Toast.makeText(getApplicationContext(), "停留在围栏内", Toast.LENGTH_LONG).show();

                        //停留在围栏内
                        break;
                    default:
                        break;

                }

            }
        }
    };

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.normal_map_button:
                aMap.setMapType(AMap.MAP_TYPE_NORMAL);
                break;
            case R.id.traffic_map_button:
                aMap.setTrafficEnabled(true);
                break;
            case R.id.night_map_button:
                aMap.setMapType(AMap.MAP_TYPE_NIGHT);
                break;
            case R.id.navigation_map_button:
                aMap.setMapType(AMap.MAP_TYPE_NAVI);
                break;
            case R.id.satellite_map_button:
                aMap.setMapType(AMap.MAP_TYPE_SATELLITE);
                break;

            case R.id.add_fence:
                addFence();
                break;
            default:
                break;
        }


    }

    private void addFence() {
        String customId = mCustomIdEditText.getText().toString();
        String radiusString = mRadiusEditText.getText().toString();
        if (TextUtils.isEmpty(customId)) {
            Toast.makeText(getApplicationContext(), "请输入围栏的业务类型", Toast.LENGTH_LONG).show();
        } else if (TextUtils.isEmpty(radiusString)) {
            Toast.makeText(getApplicationContext(), "请输入围栏的半径", Toast.LENGTH_LONG).show();
        } else {
            DPoint centerPoint = new DPoint(23.123844, 113.37294);
            float radius = Float.parseFloat(radiusString);
            mGeoFenceClient.addGeoFence(centerPoint, radius, customId);

        }
    }


    @Override
    public void onGeoFenceCreateFinished(List<GeoFence> list, int i, String s) {
        Message message = Message.obtain();
        if (i == GeoFence.ADDGEOFENCE_SUCCESS) {
            mGeoFenceList = list;
            message.what = 0;
            message.obj = s;
        } else {
            message.arg1 = i;
            message.what = 1;
        }
        mHandler.sendMessage(message);


    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            switch (msg.what) {
                case 0:
                    Toast.makeText(getApplicationContext(), "围栏添加成功" + (String) msg.obj, Toast.LENGTH_LONG).show();
                    // TODO: 2018/7/18
                    drawFence2Map();
                    break;

                case 1:
                    Toast.makeText(getApplicationContext(), "围栏添加失败", Toast.LENGTH_LONG).show();
                    break;
                case 2:
                    break;
                default:
                    break;
            }
        }
    };

    Object lock = new Object();

    void drawFence2Map() {
        new Thread() {
            @Override
            public void run() {
                try {
                    synchronized (lock) {
                        if (null == mGeoFenceList || mGeoFenceList.isEmpty()) {
                            return;
                        }
                        drawCircleFence(mGeoFenceList.get(0));
                    }
                } catch (Throwable e) {

                }
            }
        }.start();
    }

    private void drawCircleFence(GeoFence fence) {

        LatLng center = new LatLng(fence.getCenter().getLatitude(), fence.getCenter().getLongitude());
        mDestinationMarker = aMap.addMarker(new MarkerOptions()
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))

                .position(new LatLng(fence.getCenter().getLatitude(), fence.getCenter().getLongitude()))
                .title("hello demo")
                .snippet("today is wednesday!today is wednesday!today is wednesday!today is wednesday!"));
        mDestinationMarker.showInfoWindow();

        aMap.addCircle(new CircleOptions()
                .center(center)
                .radius(fence.getRadius())
                .strokeColor(Color.argb(180, 63, 145, 252))
                .fillColor(Color.argb(163, 118, 212, 243))
                .strokeWidth(5));

    }


    private void showMyLocation() {
        mMyLocationStyle = new MyLocationStyle();
        mMyLocationStyle.radiusFillColor(Color.argb(0, 0, 0, 0));
        mMyLocationStyle.strokeColor(Color.alpha(0));

        //初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点，定位点依照设备方向旋转，并且会跟随设备移动。（1秒1次定位）如果不设置myLocationType，默认也会执行此种模式。
//        mMyLocationStyle.interval(1000); //设置连续定位模式下的定位间隔，只在连续定位模式下生效，单次定位模式下不会生效。单位为毫秒。
        //设置是否显示定位小蓝点，用于满足只想使用定位，不想使用定位小蓝点的场景，设置false以后图面上不再有定位蓝点的概念，但是会持续回调位置信息。
        mMyLocationStyle.showMyLocation(true);

        aMap.setMyLocationStyle(mMyLocationStyle);//设置定位蓝点的Style

        aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点，false表示隐藏定位蓝点并不进行定位，默认是false。


//        定位蓝点图标自定义
//        MyLocationStyle myLocationIcon(BitmapDescriptor myLocationIcon);//设置定位蓝点的icon图标方法，需要用到BitmapDescriptor类对象作为参数。

//        MyLocationStyle anchor(float u, float v);//设置定位蓝点图标的锚点方法。

//        MyLocationStyle strokeColor(int color);//设置定位蓝点精度圆圈的边框颜色的方法。
//        MyLocationStyle radiusFillColor(int color);//设置定位蓝点精度圆圈的填充颜色的方法。
//        MyLocationStyle strokeWidth(float width);//设置定位蓝点精度圈的边框宽度的方法。
    }


    /**
     * 开启室内地图后，如果可见区域内包含室内地图覆盖区域（如：凯德Mall等知名商场），且缩放达到一定级别，便可直接在地图上看到精细室内地图效果。
     * <p>
     * 缩放级别≥17级时，地图上可以显示室内地图。
     * <p>
     * 缩放级别≥18级时，不仅可以看到室内地图效果，还允许操作切换楼层，显示精细化室内地图。
     * 3D 地图 SDK中默认会关闭室内地图显示，如有需要可使用类AMap 中的 showIndoorMap(boolean enable)自行开启。
     *
     * @param show
     */
    private void showIndoorMap(boolean show) {
        aMap.showIndoorMap(true);
    }


    /**
     * * 设置地图底图语言，目前支持中文底图和英文底图
     */
    private void setMapLanguage() {
//        aMap.setMapLanguage(AMap.CHINESE);
        aMap.setMapLanguage(AMap.ENGLISH);
    }

    private void initUiSettings() {
        //缩放按钮
        //缩放按钮是提供给 App 端用户控制地图缩放级别的交换按钮，每次点击改变1个级别，此控件默认打开，可以通过以下方法控制其隐藏
        //默认会显示一个+和一个-的缩放控件
        //默认开启
//        mUiSettings.setZoomControlsEnabled(false);

        //设置缩放按钮的位置 默认是右下角 位置的产量都在AMapOptions中
        //右下角 AMapOptions.ZOOM_POSITION_RIGHT_BUTTOM
        //右边界中部：AMapOptions.ZOOM_POSITION_RIGHT_CENTER
        //默认显示在右下角
//        mUiSettings.setZoomPosition(AMapOptions.ZOOM_POSITION_RIGHT_BUTTOM);

        //指南针
        //指南针用于向 App 端用户展示地图方向，
        // 默认不显示
        //位置显示在左上角
        mUiSettings.setCompassEnabled(true);


        //设置默认定位按钮是否显示,
        // 默认不显示,
        // 官方没有提供可以修改位置的参数，但是可以自己修改一下
        mUiSettings.setMyLocationButtonEnabled(true);

        //比例尺控件
        // 比例尺控件（最大比例是1：10m,最小比例是1：1000Km），位于地图右下角，可控制其显示与隐藏
        // 默认隐藏
        mUiSettings.setScaleControlsEnabled(true);


        //地图Logo
        //高德地图的 logo 默认在左下角显示，不可以移除，但支持调整到固定位置
        mUiSettings.setLogoPosition(AMapOptions.LOGO_MARGIN_LEFT);

    }


    /**
     * 显示一个点的位置，默认是一个💧水滴状的的图标，如果加上你title和snippet等信息的话点击你图标会弹出一个窗体显示title和snippet
     *
     * @param latLng
     */
    private void showMarker(LatLng latLng) {


        /*
        position

        在地图上标记位置的经纬度值。必填参数

        title 点标记的标题

        snippet 点标记的内容

        draggable 点标记是否可拖拽

        visible 点标记是否可见

        anchor 点标记的锚点

        alpha 点的透明度


        icon maker 的图标

        rotateAngle(float rotate) 设置Marker覆盖物的图片旋转角度，从正北开始，逆时针计算。

       setFlat(boolean flat) 设置Marker覆盖物是否平贴地图。
         */

        Marker marker = aMap.addMarker(new MarkerOptions().position(latLng).title("北京").snippet("中华人民共和国"));
    }

    /***
     * InfoWindow 是点标记的一部分，默认的 Infowindow 只显示 Marker 对象的两个属性，一个是 title 和另一个
     * snippet，如果希望对InfoWindow 的样式或者内容有自定义需求，可以参考如下内容。
     * @return
     */
    private void DIYInfoInfoWindow() {

        //InfoWindow 是点标记的一部分，默认的 Infowindow 只显示 Marker 对象的两个属性，
        // 一个是 title 和另一个 snippet，如果希望对InfoWindow 的样式或者内容有自定义需求，可以参考如下内容。
        //当改变 Marker 的 title 和 snippet 属性时，再次调用 showInfoWindow()，可以更新 InfoWindow 显示内容

    }


    /***
     *
     * 绘制线
     * 地图上绘制的线是由 Polyline 类定义实现的，线由一组经纬度（LatLng对象）点连接而成。
     */
    private void addPolyline() {
        List<LatLng> latLngs = new ArrayList<LatLng>();
        latLngs.add(new LatLng(23, 113));
        latLngs.add(new LatLng(39.898323, 116.057694));
        latLngs.add(new LatLng(39.900430, 116.265061));
        latLngs.add(new LatLng(39.955192, 116.140092));
        Polyline polyline = aMap.addPolyline(new PolylineOptions().
                addAll(latLngs).width(10).color(Color.argb(255, 1, 1, 1)));

        /*
        setCustomTexture(BitmapDescriptor customTexture) 设置线段的纹理，建议纹理资源长宽均为2的n次方

        setCustomTextureIndex(java.util.List<java.lang.Integer> custemTextureIndexs)设置分段纹理index数组

        setCustomTextureList(java.util.List customTextureList)设置分段纹理list

        setDottedLine(boolean isDottedLine)设置是否画虚线，默认为false，画实线。

        setUseTexture(boolean useTexture)是否使用纹理贴图

        useGradient(boolean useGradient)设置是否使用渐变色

        visible(boolean isVisible)设置线段的可见性

        width(float width)设置线段的宽度，单位像素

        zIndex(float zIndex)设置线段Z轴的值
         */
    }


    /**
     * 圆形由 Circle 类定义实现，构造一个圆形需要确定它的圆心和半径
     */
    private void drawCrilcle() {
        LatLng latLng = new LatLng(23.12388, 113.3);
        Circle circle = aMap.addCircle(new CircleOptions().
                center(latLng).
                radius(1000).
                fillColor(Color.argb(10, 1, 1, 1)).
                strokeColor(Color.argb(70, 1, 1, 1)).
                strokeWidth(15));
    }

    /**
     * 地图 SDK 提供了多种手势供 App 端用户与地图之间进行交互，如缩放、旋转、滑动、倾斜。
     * 这些手势默认开启，如果想要关闭某些手势，可以通过 UiSetting 类提供的接口来控制手势的开关。
     */
    private void gestureInteraction() {
        //缩放手势
        mUiSettings.setZoomGesturesEnabled(true);
        //滑动手势
        mUiSettings.setScrollGesturesEnabled(true);

        //旋转手势
        mUiSettings.setRotateGesturesEnabled(true);
        //倾斜手势
        mUiSettings.setTiltGesturesEnabled(true);

        //所有手势
        mUiSettings.setAllGesturesEnabled(true);


    }


    //从location对象中获取经纬度信息，地址描述信息，建议拿到位置之后调用逆地理编码接口获取（获取地址描述数据章节有介绍）
    @Override
    public void onMyLocationChange(Location location) {
        if (location != null) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            StringBuffer sb = new StringBuffer();

            LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
            float distance = AMapUtils.calculateLineDistance(latLng, mDestinationMarker.getPosition());
            Marker marker = aMap.getMapScreenMarkers().get(0);
            marker.setTitle("你今天需要上班考勤");
            marker.setSnippet("距离考勤结束还有5分钟，加油哦！\n" +
                    "距离目的地还有" + distance + "米");

            marker.showInfoWindow();
            /**
             * double 经度 获取经度
             */
            sb.append("经    度    : " + location.getLongitude() + "\n");
            /**
             * double 纬度 获取纬度
             */
            sb.append("纬    度    : " + location.getLatitude() + "\n");

            /**
             * float 精度 获取定位精度 单位:米
             */
            sb.append("精    度    : " + location.getAccuracy() + "米" + "\n");
            /**
             double 海拔 获取海拔高度信息
             */
            sb.append("海    拔    ：" + location.getAltitude() + "米" + "\n");

                    /*
                    String  信息提供方，lbs:高德网络定位 gps:设备gps模块
                     */
            sb.append("提供者    : " + location.getProvider() + "\n");


            //定位完成的时间
            sb.append("定位时间: " + simpleDateFormat.format(location.getTime()) + "\n");


            //解析定位结果，
            String result = sb.toString();
            mTextView.setText(result);
        }


    }

    /**
     * 初始化权限，请求用户获取对应的权限 没有获取的都可直接加到列表中
     */
    private void initPermissions() {
        List<String> permissionList = new ArrayList<>();

        //用于进行网络定位
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        }

        //用于访问GPS定位
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }

        //用户储存的权限，定位的一些缓存数据可能需要存储
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE);
        }

        //读取手机状态等信息，比如所网络的状态等
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.READ_PHONE_STATE);
        }

        //判断是否还有没有获得的权限，如果有，就逐个申请对应的权限
        if (permissionList.size() > 0) {
            String[] permissions = new String[permissionList.size()];
            permissionList.toArray(permissions);
            ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
        }
    }

    /**
     * 获取权限的状态等 ，检查一下有没有没有通过的权限
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    for (int i : grantResults) {
                        if (i != PackageManager.PERMISSION_GRANTED) {
                            Toast.makeText(MainActivity.this, "请允许相关的权限才能使用定位功能哦", Toast.LENGTH_LONG).show();
                            finish();
                        }
                    }
                }
        }
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView.onResume ()，重新绘制加载地图
        mapView.onResume();
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState)，保存地图当前的状态
        mapView.onSaveInstanceState(outState);
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView.onPause ()，暂停地图的绘制
        mapView.onPause();
        deactivate();
    }


    /**
     * 方法必须重写
     */
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy()，销毁地图
        mapView.onDestroy();
        try {
            unregisterReceiver(mBroadcastReceiver);
        } catch (Throwable e) {
        }

        if (null != mGeoFenceClient) {
            mGeoFenceClient.removeGeoFence();
        }
        if (null != mLocationClient) {
            mLocationClient.onDestroy();
        }
    }


    /**
     * 点击 Marker 时会回调AMap.OnMarkerClickListener
     *
     * @param marker
     * @return
     */
    @Override
    public boolean onMarkerClick(Marker marker) {
        String title = marker.getTitle();
        if (title != null && title.equals("hello demo")) {
            marker.showInfoWindow();
            return true;
        } else {
            marker.setTitle("hello world");
            marker.setSnippet("icbc is interesting! icbc is interesting!\n" +
                    "icbc is interesting");
            marker.showInfoWindow();
            return true;
        }

    }

    @Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {

        mListener = onLocationChangedListener;
        if (mLocationClient == null) {
            mLocationClient = new AMapLocationClient(this);
            mOption = new AMapLocationClientOption();
            mLocationClient.setLocationListener(this);
            mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            mOption.setWifiScan(true);
            mOption.setNeedAddress(true);
            mOption.setLocationCacheEnable(true);
            mOption.setInterval(1 * 1000);
            mLocationClient.setLocationOption(mOption);
            mLocationClient.startLocation();
        }
    }

    @Override
    public void deactivate() {
        mListener = null;
        if (mLocationClient != null) {
            mLocationClient.startLocation();
            mLocationClient.onDestroy();
        }
        mLocationClient = null;

    }

    @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        if (mListener != null && aMapLocation != null) {
            if (aMapLocation != null && aMapLocation.getErrorCode() == 0) {
//                mListener.onLocationChanged(aMapLocation);
            } else {
                Log.d(TAG, "onLocationChanged: 定位失败  errorCode ：" + aMapLocation.getErrorCode()
                        + ":" + aMapLocation.getErrorInfo());
            }
        }

    }


//    /***
//     *  Marker拖拽的监听
//     *
//     * @param marker
//     */
//    @Override
//    public void onMarkerDragStart(Marker marker) {
//
//        // 当marker开始被拖动时回调此方法, 这个marker的位置可以通过getPosition()方法返回。
//        // 这个位置可能与拖动的之前的marker位置不一样。
//        // marker 被拖动的marker对象。
//    }
//
//    @Override
//    public void onMarkerDrag(Marker marker) {
//        // 在marker拖动过程中回调此方法, 这个marker的位置可以通过getPosition()方法返回。
//        // 这个位置可能与拖动的之前的marker位置不一样。
//        // marker 被拖动的marker对象。
//
//    }
//
//    @Override
//    public void onMarkerDragEnd(Marker marker) {
//
//        // 在marker拖动完成后回调此方法, 这个marker的位置可以通过getPosition()方法返回。
//        // 这个位置可能与拖动的之前的marker位置不一样。
//        // marker 被拖动的marker对象。
//
//    }
}
